/**
 *textarea扩展方法 
 */
(function(jQuery) {
	jQuery.fn.extend({
		elastic: function() {
			var mimics = ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'fontSize', 'lineHeight', 'fontFamily', 'width', 'fontWeight'];
			return this.each(function() {
				if (this.type != 'textarea') {
					return false;
				}
				var $textarea = jQuery(this),
				$twin = jQuery('<div />').css({
					'position': 'absolute',
					'display': 'none',
					'word-wrap': 'break-word'
				}),
				lineHeight = parseInt($textarea.css('line-height'), 10) || parseInt($textarea.css('font-size'), '10'),
				minheight = parseInt($textarea.css('height'), 10) || lineHeight * 3,
				maxheight = parseInt($textarea.attr('maxheight'), 10) || Number.MAX_VALUE,
				goalheight = 0,
				i = 0;
				if (maxheight < 0) {
					maxheight = Number.MAX_VALUE;
				}
				$twin.appendTo($textarea.parent());
				var i = mimics.length;
				while (i--) {
					$twin.css(mimics[i].toString(), $textarea.css(mimics[i].toString()));
				}
				function setHeightAndOverflow(height, overflow) {
					curratedHeight = Math.floor(parseInt(height, 10));
					if ($textarea.height() != curratedHeight) {
						$textarea.css({
							'height': curratedHeight + 'px',
							'overflow': overflow
						});
					}
				}
				function update() {
					var textareaContent = $textarea.val().replace(/&/g, '&amp;').replace(/  /g, '&nbsp;').replace(/<|>/g, '&gt;').replace(/\n/g, '<br />');
					var twinContent = $twin.html();
					if (textareaContent + '&nbsp;' != twinContent) {
						$twin.html(textareaContent + '&nbsp;');
						if (Math.abs($twin.height() + lineHeight - $textarea.height()) > 3) {
							var goalheight = $twin.height() + lineHeight;
							if (goalheight >= maxheight) {
								setHeightAndOverflow(maxheight, 'auto');
							} else if (goalheight <= minheight) {
								setHeightAndOverflow(minheight, 'hidden');
							} else {
								setHeightAndOverflow(goalheight, 'hidden');
							}
						}
					}
				}
				$textarea.css({
					'overflow': 'hidden'
				});
				$textarea.keyup(function() {
					update();
				});
				$textarea.live('input paste',
				function(e) {
					setTimeout(update, 250);
				});
				update();
			})
		}
	})
})(jQuery);